<?php

/**
 *  wx使用授权码换取授权公众号的授权信息，并换取authorizer_access_token和authorizer_refresh_token 保存表
 *  授权码的获取，需要在用户在第三方平台授权页中完成授权流程后，在回调URI中通过URL参数提供给第三方平台方。
 *  请注意，由于现在公众号可以自定义选择部分权限授权给第三方平台，因此第三方平台开发者需要通过该接口来获取公众号具体授权了哪些权限，
 *  而不是简单地认为自己声明的权限就是公众号授权的权限。
 * @author perry
 */

namespace Home\Model;

use Think\Model;

class AuthorizationInfoModel extends Model {


    /**
     * 初始化
     */
    function _initialize() {
        $this->tableName = 'weixin_authorization_info';
        $this->trueTableName  = 'eosi_weixin_authorization_info';
    }

    //根据appid获得授权给三方平台的公众号的authorizer token
    // func_info_id:公众号授权给开发者的权限集列表，ID为1到15时分别代表：
    // 消息管理权限
    // 用户管理权限
    // 帐号服务权限
    // 网页服务权限 包括网页授权和自定义分享
    // 微信小店权限
    // 微信多客服权限
    // 群发与通知权限
    // 微信卡券权限
    // 微信扫一扫权限
    // 微信连WIFI权限
    // 素材管理权限
    // 微信摇周边权限
    // 微信门店权限
    // 微信支付权限
    // 自定义菜单权限

    function getAuthorizerAccessToken($appid,$func_info_id=4){
        $exist=$this->getByAppid($appid);
        if(!$exist){
            throw new \Exception("appid：".$appid."还未授权，暂无法使用.", -291);
        }
        if($exist['status']!=1){
            throw new \Exception("appid：".$appid."已取消授权，暂无法使用.", -299);
        }
        if(!$this->func_exist($func_info_id,$exist['func_info'])){
            throw new \Exception("appid：".$appid."未授予我们权限编号".$func_info_id."，暂无法使用.", -299);
        }
        if($exist['expires_at']<time()){
            //authorizer token 已过期，需要根据refresh token重新获取
            $thirdAppid=C('third_app_id');
            $thirdAppsecret=C('third_app_secret');
            $sdk = new \Home\ORG\WeixinThirdSDK($thirdAppid,$thirdAppsecret);
            $re = $sdk->getRefreshPingju($exist['authorizer_appid'],$exist['authorizer_refresh_token']);
            $exist['authorizer_access_token']=$re['authorizer_access_token'];
            $exist['expires_in']=$re['expires_in'];
            $exist['authorizer_refresh_token']=$re['authorizer_refresh_token'];
            $exist=$this->updateOne($exist['id'],$exist);
        }
        return $exist['authorizer_access_token'];
    }
    
    function getByAppid($appid){
        $map=array();
        $map['authorizer_appid']=$appid;
    	$u = $this->where($map)->find();
    	return $u;
    }

    function updateOne($id,$data){
        $data['update_time']=time();
        $data['expires_at']=$data['update_time']+$data['expires_in']-1200;
        $map=array();
        $map['id']=$id;
        $this->where($map)->save($data);
        $data['id']=$id;
        return $data;
    }
    
    //新增一条授权数据
    function addOne($data){
    	$u = $this->getByAppid($data['authorizer_appid']);
        $data['func_info']=json_encode($data['func_info']);
        $data['status'] = 1;
    	if($u){
            $data=$this->updateOne($u['id'],$data);
    	}
        else {
            $data['create_time']=time();
            $data['expires_at']=$data['create_time']+$data['expires_in']-1200;
            $data['id']=$this->add($data);
        }
    	return $data;
    }

    //对已有数据取消了授权
//     <xml>
// <AppId>第三方平台appid</AppId>
// <CreateTime>1413192760</CreateTime>
// <InfoType>unauthorized</InfoType>
// <AuthorizerAppid>公众号appid</AuthorizerAppid>
// </xml>
    function unauthorized($data){
        $map=array();
        $map['authorizer_appid']=$data['AuthorizerAppid'];
        $map['status']=1;
        $data=array('update_time'=>time(),'status'=>-1);
        $rows=$this->where($map)->save($data);
        return $rows;
    }

//微信 公众号对三方平台的授权陈宫通知
//     <xml>
// <AppId>第三方平台appid</AppId>
// <CreateTime>1413192760</CreateTime>
// <InfoType>authorized</InfoType>
// <AuthorizerAppid>公众号appid</AuthorizerAppid>
// <AuthorizationCode>授权码（code）</AuthorizationCode>
// <AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime>
// </xml>
    function authorized($data){
        $auth_code=$data['AuthorizationCode'];
        // $expires_in=$data['AuthorizationCodeExpiredTime'];
        $exist=$this->getByAppid($data['AppId']);
        if($exist && $exist['status']==1){
            return true;
        }
        try {
            $thirdAppid=C('third_app_id');
            $thirdAppsecret=C('third_app_secret');
            $sdk=new \Home\ORG\WeixinThirdSDK($thirdAppid,$thirdAppsecret);
              //公众号的接口调用凭据和授权信息
              $allPingju = $sdk -> getPingju($auth_code);
              $allPingju=$allPingju['authorization_info'];
              $this->addOne($allPingju);
        } catch (Exception $e) {
          
        }
    }

    function updateauthorized($data){
        return $this->authorized($data);
    }

    //判断指定的权限集id是否在公众号已授权给我们的权限集合内
    //$func_id    指定的权限集id
    //$func_json  [{"funcscope_category":{"id":15}},{"funcscope_category":{"id":4}},{"funcscope_category":{"id":2}}]
    private function func_exist($func_id,$func_json){
        $arr = json_decode($func_json,true);
        foreach ($arr as $key => $value) {
            if($value['funcscope_category']['id']==$func_id){
                return true;
            }
        }
        return false;
    }
}
